package sifeap.pl.managedbean.usuarios;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import sifeap.bl.ejb.usuarios.UsuarioBLLocal;
import sifeap.entities.usuarios.PreguntaSeguridad;
import sifeap.entities.usuarios.Usuario;
import sifeap.entities.usuarios.valueobject.UsuarioVO;
import sifeap.exception.SifeapException;
import sifeap.pl.util.FacesUtils;

@ManagedBean(name="cambiarContrasenaManagedBean")
@SessionScoped
public class CambiarContrasenaManagedBean {
	private UsuarioVO usuarioSesion;
	private UsuarioVO usuarioVo;
	
	private final String MENSAJES_BUNDLE = "sifeap.pl.bundles.mensajes";
	
	@EJB
	private UsuarioBLLocal usuarioBL;
	
	@PostConstruct
	public void inicializar() {
		cargarUsuario();
	}
	
	private void cargarUsuario() {
		//Captura el usuario de la sesion
		usuarioSesion = (UsuarioVO) FacesUtils.getSessionAttribute(LoginManagedBean.USER_LOGIN);
		
		if (usuarioSesion != null) {
			usuarioVo = new UsuarioVO();
			Usuario usuario = new Usuario();
			usuario.setNombreUsuario(usuarioSesion.getUsuario().getNombreUsuario());
			usuario.setPreguntasseguridad(new PreguntaSeguridad());
			usuario.setRespuestapregunta(usuarioSesion.getUsuario().getRespuestapregunta());
			
			PreguntaSeguridad pregunta = usuarioSesion.getUsuario().getPreguntasseguridad(); 
			if (pregunta != null) {
				usuario.getPreguntasseguridad().setIdPreguntaSeguridad(pregunta.getIdPreguntaSeguridad());
				
			}
			
			usuarioVo.setUsuario(usuario);
		}
	}
	
	public UsuarioVO getUsuarioVo() {
		return usuarioVo;
	}

	public void setUsuarioVo(UsuarioVO usuarioVo) {
		this.usuarioVo = usuarioVo;
	}
	
	public List<SelectItem> getItemsPreguntasSeguridad() {
		List<PreguntaSeguridad> listaPreguntasSeguridad = null;
		try {
			listaPreguntasSeguridad = usuarioBL.buscarTodasPreguntasSeguridad();
		} catch (SifeapException e) {
			e.printStackTrace();
		}
		
		List <SelectItem> itemsPreguntasSeguridad = new ArrayList<SelectItem>();
		if (listaPreguntasSeguridad != null) {
			for (PreguntaSeguridad preguntaSeguridad : listaPreguntasSeguridad) {
				itemsPreguntasSeguridad.add(new SelectItem(preguntaSeguridad.getIdPreguntaSeguridad(), preguntaSeguridad.getPregunta()));
			}
		}
		return itemsPreguntasSeguridad;
	}
	
	public void guardar() {
		try {
			byte resultado = usuarioBL.cambiarContrasena(usuarioVo);
			
			//Evalua la respuesta de BL
			switch (resultado) {
			case 0:
				//Se produjo un error
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.cambiarcontrasena.crear.error"), false);
				break;
			case 1:
				//Se guardo correctamente
				
				//Debe subir el nuevo usuario a la sesion
				try {
					UsuarioVO usuario = usuarioBL.buscarPorId(usuarioVo.getUsuario().getNombreUsuario());
					FacesUtils.setSessionAttribute(LoginManagedBean.USER_LOGIN, usuario);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.cambiarcontrasena.crear.exito"), false);
				break;
			case 2:
				//La contrasena actual no concuerda
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.cambiarcontrasena.noconcuerda"), false);
				break;
			case 3:
				//La contrasenas escritas no concuerdan
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.cambiarcontrasena.noconcuerdannuevas"), false);
				break;
			}
			
			limpiar();
			
		} catch (SifeapException e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.cambiarcontrasena.crear.error"), false);
			} catch (Exception e2) {}
			e.printStackTrace();
		}
	}
	
	public String limpiar() {
		cargarUsuario();
		return "/web/usuarios/cambiarContrasena.jsf?faces-redirect=true";
	}
	
	/**
	 * Verifica si para el usuario autenticado tiene los permisos solicitados
	 * @return
	 */
	public boolean isTienePermisos() {
		return LoginManagedBean.tienePermisos("cambiar_contrasena:editar");
	}
}